package com.loopj.android.http;

import java.lang.ref.WeakReference;

import android.util.Log;

/**
 * A Handle to an AsyncRequest which can be used to cancel a running request.
 */
public class RequestHandle {
	private final WeakReference<AsyncHttpRequest> request;

	public RequestHandle(AsyncHttpRequest request) {
		this.request = new WeakReference<AsyncHttpRequest>(request);
	}

	/**
	 * Attempts to cancel this request. This attempt will fail if the request
	 * has already completed, has already been cancelled, or could not be
	 * cancelled for some other reason. If successful, and this request has not
	 * started when cancel is called, this request should never run. If the
	 * request has already started, then the mayInterruptIfRunning parameter
	 * determines whether the thread executing this request should be
	 * interrupted in an attempt to stop the request.
	 * <p>
	 * &nbsp;
	 * </p>
	 * After this method returns, subsequent calls to isDone() will always
	 * return true. Subsequent calls to isCancelled() will always return true if
	 * this method returned true.
	 * 
	 * @param mayInterruptIfRunning
	 *            true if the thread executing this request should be
	 *            interrupted; otherwise, in-progress requests are allowed to
	 *            complete
	 * @return false if the request could not be cancelled, typically because it
	 *         has already completed normally; true otherwise
	 */
	public boolean cancel(boolean mayInterruptIfRunning) {
		AsyncHttpRequest _request = request.get();
		Log.d("RequestHandle", String.valueOf(_request));
		return _request == null || _request.cancel(mayInterruptIfRunning);
	}

	/**
	 * Returns true if this task completed. Completion may be due to normal
	 * termination, an exception, or cancellation -- in all of these cases, this
	 * method will return true.
	 * 
	 * @return true if this task completed
	 */
	public boolean isFinished() {
		AsyncHttpRequest _request = request.get();
		return _request == null || _request.isDone();
	}

	/**
	 * Returns true if this task was cancelled before it completed normally.
	 * 
	 * @return true if this task was cancelled before it completed
	 */
	public boolean isCancelled() {
		AsyncHttpRequest _request = request.get();
		return _request == null || _request.isCancelled();
	}

	public boolean shouldBeGarbageCollected() {
		boolean should = isCancelled() || isFinished();
		if (should)
			request.clear();
		return should;
	}
}